package com.hyts.bmsp.config;

import com.hyts.bmsp.interceptor.ExceptionInterceptor;
import com.hyts.bmsp.interceptor.SessionInterceptor;
import com.hyts.bmsp.interceptor.TransactionInterceptor;
import com.hyts.bmsp.jfinal.beans.WebMappingBean;
import com.hyts.bmsp.jfinal.beans.WebRouteBean;
import com.hyts.bmsp.jfinal.scanner01.JfinalClassScanner;
import com.hyts.bmsp.plugin.ActiveRecordSupportPlugin;
import com.hyts.bmsp.plugin.C3p0SupportPlugin;
import com.hyts.bmsp.plugin.EhcacheSupportPlugin;
import org.apache.commons.lang.StringUtils;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.json.FastJsonFactory;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.log.Log;
import com.jfinal.log.Log4jLogFactory;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.render.ViewType;

/**
 * @ClassName: WebServer
 * @Description: web系统框架配置信息操作
 * @author: 李博/Alex
 * @date: 2017-1-6 下午11:16:00
 */
public final class WebServer extends JFinalConfig {

	/**
	 * 加载静态方法操作加载对应的a_little_config.txt文件
	 */
	private static Prop prop = null;
	/**s
	 * @fieldName: logger
	 * @fieldType: Logger
	 * @Description: 日志输出器
	 */
	private static final Log logger = Log.getLog(WebConfig.class);
	
	
	//静态方法加载配置文件操作
	static{
		// 第一次使用use加载的配置将成为主配置，可以通过PropKit.get(...)直接取值
		if(prop == null)
			prop = PropKit.use("web.properties");
	}
	/* (non Javadoc)
	 * @Title: configConstant
	 * @Description: configConstant配置参数操作 constant对象数据配置
	 * @param arg0
	 * @see com.jfinal.config.JFinalConfig#configConstant(com.jfinal.config.Constants)
	 */
	@Override
	public void configConstant(Constants me) {
		logger.info("开始启动加载Web系统初始化静态参数信息......");
		//配置开发模式：true
		me.setDevMode(prop.getBoolean("devMode",true));
		logger.info("是否以开发模式启动进行框架启动:"+((me.getDevMode())?"是":"否"));
		//配置系统总体加载字符编码
		me.setEncoding(prop.get("encode"));
		logger.info("进行编辑编码类型格式:"+me.getEncoding());
		//配置系统视图的配置视图类型
		switch(PropKit.getInt("viewType",2)){
			case 1 : me.setViewType(ViewType.JSP);break;
			case 2 : me.setViewType(ViewType.FREE_MARKER);break;
			case 3 : me.setViewType(ViewType.VELOCITY);break;
			case 4 : me.setViewType(ViewType.OTHER);break;
		}
		logger.info("进行视图样式类型格式:"+me.getViewType());
		//配置下载路径以及上传路径
		logger.info("进行加载基础上传路径:"+prop.get("baseUploadPath"));
		me.setBaseUploadPath(prop.get("baseUploadPath"));
		logger.info("进行加载基础下载路径:"+prop.get("baseDownloadPath"));
		me.setBaseDownloadPath(prop.get("baseDownloadPath"));
		//主题视图信息路径
		logger.info("进行加载基础视图路径:"+prop.get("baseViewPath"));
		if(StringUtils.isNotEmpty(prop.get("baseViewPath")))
			me.setBaseViewPath(prop.get("baseViewPath"));
		logger.info("请求参数分隔符："+prop.get("urlParaSeparator","&"));
		//url参数配置加载数据参数
		me.setUrlParaSeparator(prop.get("urlParaSeparator"));
		//设置JsonFactory类
		logger.info("com.alibaba.fastJson 作为 系统架构JSON解析工具");
		me.setJsonFactory(new FastJsonFactory());
		//启动国际化Locale操作信息：
		logger.info("系统设置国际化标准："+WebConfig.localeType.getNameByCode(prop.get("localeBaseName")));
		me.setI18nDefaultBaseName(prop.get("localeBaseName"));
		//扩展log4jfactory工具类
		me.setLogFactory(new Log4jLogFactory());
	}

	/* (non Javadoc)
	 * @Title: configHandler
	 * @Description: 总体配置信息框架处理器
	 * @param arg0
	 * @see com.jfinal.config.JFinalConfig#configHandler(com.jfinal.config.Handlers)
	 */
	public void configHandler(Handlers arg0) {
		// TODO Auto-generated method stub
	}

	/* (non Javadoc)
	 * @Title: configInterceptor
	 * @Description:增添系统全局拦截器：此方法用来配置 JFinal 的全局拦截器<br>
	 * 				全局拦截器将拦截所有 action 请求，除非使用<br>
					@Clear 在 Controller 中清除<br>
	 * @param arg0
	 * @see com.jfinal.config.JFinalConfig#configInterceptor(com.jfinal.config.Interceptors)
	 */
	@Override
	public void configInterceptor(Interceptors me) {
		logger.info("开始初始化系统拦截器操作......");
		logger.info("加载系统Session认证拦截器......");
		//针对于一些特殊的不需要进行拦截的方法：进行调整clear清除即可
		me.addGlobalActionInterceptor(new SessionInterceptor());
		//仅对于所有的Controller控制器进行编码调整
		logger.info("加载系统Controller认证拦截器......");
		me.addGlobalActionInterceptor(new ExceptionInterceptor());
		//针对于业务数据提交操作进行控制
		logger.info("加载系统事务级认证拦截器......");
		me.add(new TransactionInterceptor());
		logger.info("结束加载系统拦截器操作......");
	}

	/* (non Javadoc)
	 * @Title: configPlugin
	 * @Description: 配置系统核心的相关插件信息控制操作
	 * @param plugin
	 * @see com.jfinal.config.JFinalConfig#configPlugin(com.jfinal.config.Plugins)
	 */
	@Override
	public void configPlugin(Plugins plugin) {
		if(plugin == null)
			throw new RuntimeException("传入的Plugin插件为空!");
		logger.info("启动所有Plugin插件信息");
		//启动C3p0Plugin插件
		C3p0SupportPlugin c3p0Plugin = new C3p0SupportPlugin(plugin);
		//启动ActiveRecordPlugin插件
		ActiveRecordSupportPlugin arPlugin = new ActiveRecordSupportPlugin(c3p0Plugin.getC3p0Plugin());
		ActiveRecordPlugin plugin2 = arPlugin.getArPlugin();
		plugin.add(plugin2);
		logger.info("开始初始化静态实体域数据库持久化操作的整合到JFinal");
		for(WebMappingBean bean: JfinalClassScanner.getMappingsList()){
			if(StringUtils.isNotEmpty(bean.getPrimaryKey())){
				plugin2.addMapping(bean.getTableName(), bean.getModelClass());
			}else{
				plugin2.addMapping(bean.getTableName(),bean.getPrimaryKey(),bean.getModelClass());
			}
		}
		//启动加载RedisPlugin插件
	//	new RedisSupportPlugin(plugin);
		//启动加载EhcachePlugin插件
		new EhcacheSupportPlugin(plugin);
	}

	/* (non Javadoc)
	 * @Title: configRoute
	 * @Description: 路由配置信息操作：路由信息操作映射关系
	 * @param arg0
	 * @see com.jfinal.config.JFinalConfig#configRoute(com.jfinal.config.Routes)
	 */
	@Override
	public void configRoute(Routes route) {
		logger.info("开始加载系统映射路径......");
		for(WebRouteBean bean:JfinalClassScanner.getRoutesList()){
			route.add((Routes)bean.getClassEntry());
			logger.info("注入Route路由：route-key:"+bean.getRouteKey()+" route-value:"+bean.getRouteValue()+" ControllerClass:"+bean.getClassEntry().getClass().getName());
		}
		logger.info("已经将对应的系统所有的映射路径注入到RouteMap列表中......");
		WebContainer.setRouteMap(route.getEntrySet());
	}

	/* (non Javadoc)
	 * @Title: afterJFinalStart
	 * @Description: 启动时候进行操作方法
	 * @see com.jfinal.config.JFinalConfig#afterJFinalStart()
	 */
	@Override
	public void afterJFinalStart() {
		logger.info("——————————————————————————————————————【完成加载实现系统服务】——————————————————————————————————————");
	}

	/* (non Javadoc)
	 * @Title: beforeJFinalStop
	 * @Description: 体质系统时候进行操作方法
	 * @see com.jfinal.config.JFinalConfig#beforeJFinalStop()
	 */
	@Override
	public void beforeJFinalStop() {
		super.beforeJFinalStop();
	}
	
}
